/**
 * 定义了一个用于获取和管理环境属性的接口
 * 它提供了获取属性、获取活动配置文件和默认配置文件、以及检查是否接受特定配置文件的功能
 */
package com.test.environment;

/**
 * Environment接口定义了用于获取和管理环境属性的方法
 * 它允许应用程序根据环境配置进行灵活的设置和查询
 */
public interface Environment {

    /**
     * 根据键获取属性值
     *
     * @param key 属性的键，不能为空
     * @return 属性值，如果不存在则返回null
     */
    String getProperty(String key);

    /**
     * 根据键获取属性值，如果不存在则返回默认值
     *
     * @param key 属性的键，不能为空
     * @param defaultValue 如果指定的键不存在时返回的默认值
     * @return 属性值或默认值
     */
    String getProperty(String key, String defaultValue);

    /**
     * 根据键获取属性值，并将其转换为目标类型
     *
     * @param key 属性的键，不能为空
     * @param targetType 属性值的目标类型
     * @param <T> 目标类型的泛型标记
     * @return 转换后的属性值，如果不存在或无法转换则返回null
     */
    <T> T getProperty(String key, Class<T> targetType);

    /**
     * 根据键获取属性值，并将其转换为目标类型，如果不存在则返回默认值
     *
     * @param key 属性的键，不能为空
     * @param targetType 属性值的目标类型
     * @param defaultValue 如果指定的键不存在时返回的默认值
     * @param <T> 目标类型的泛型标记
     * @return 转换后的属性值或默认值
     */
    <T> T getProperty(String key, Class<T> targetType, T defaultValue);

    /**
     * 检查是否存在指定键的属性
     *
     * @param key 要检查的属性键，不能为空
     * @return 如果存在指定键的属性则返回true，否则返回false
     */
    boolean containsProperty(String key);

    /**
     * 获取当前活动的配置文件名称数组
     *
     * @return 活动配置文件名称数组，可能为空数组但不为null
     */
    String[] getActiveProfiles();

    /**
     * 获取默认的配置文件名称数组
     *
     * @return 默认配置文件名称数组，可能为空数组但不为null
     */
    String[] getDefaultProfiles();

    /**
     * 检查是否接受指定的配置文件
     *
     * @param profile 要检查的配置文件名称，不能为空
     * @return 如果接受指定的配置文件则返回true，否则返回false
     */
    boolean acceptsProfiles(String profile);

    /**
     * 检查是否接受一组指定的配置文件
     *
     * @param profiles 要检查的配置文件名称数组，不能为空
     * @return 如果接受一组指定的配置文件则返回true，否则返回false
     */
    boolean acceptsProfiles(String... profiles);
}
